package com.mcc.myapplication


/**
 * 何时使用数组
 */
fun useDemo() {
    // Kotlin 中最常见的数组类型是对象类型数组，由 Array 类表示。
    // 如果在对象类型数组中使用原生类型，那么会对性能产生影响，因为原生值都装箱成了对象。 为了避免装箱开销，请改用原生类型数组。
    var strArray = arrayOf("At", "Brod", "Cak")
    // 使用 += 赋值操作创建了一个新的 riversArray，复制了原始元素并添加新元素
    strArray += "Dart"
    println(strArray.joinToString("-"))
}

/**
 * 创建数组
 * arrayOf()  arrayOfNulls()  emptyArray() and Array constructor.
 */
fun arrayDemo() {
    val arr1 = arrayOf(1, 2, 3, 4, 5, 6)
    println(arr1.joinToString())

    val nullArray: Array<Int?> = arrayOfNulls(3)
    println(nullArray.joinToString())

    var exampleArray = emptyArray<String>()
    var exampleArray2: Array<String> = emptyArray()
}

fun arrayDemo2() {
    // Creates a two-dimensional array
    val twoDArray = Array(2) { Array<Int>(2) { 0 } }
    println(twoDArray.contentDeepToString())
    // [[0, 0], [0, 0]]

    // Creates a three-dimensional array
    val threeDArray = Array(3) { Array(3) { Array<Int>(3) { 0 } } }
    println(threeDArray.contentDeepToString())
}

/**
 * 访问与修改元素
 */
fun operatorDemo() {
    val intArray = arrayOf(1, 2, 3)
    intArray[0] = 10
    println(intArray.joinToString())
}

fun printAllStrings(vararg strings: String) {
    for (string in strings) {
        print(string)
    }
}

fun varargDemo() {
    val lettersArray = arrayOf("c", "d")
    printAllStrings("a", "b", *lettersArray)
    println()
}

/**
 * 将数组转换为集合
 */

fun toListDemo() {
    val simpleArray = arrayOf("a", "b", "c", "c")
    println(simpleArray.toSet())
    println(simpleArray.toList())

    val pairArray = arrayOf("apple" to 120, "banana" to 150, "cherry" to 90, "apple" to 140)
    println(pairArray.joinToString())
    println(pairArray.toMap())

}

/**
 * BooleanArray	boolean[]
 * ByteArray	byte[]
 * CharArray	char[]
 * DoubleArray	double[]
 * FloatArray	float[]
 * IntArray	    int[]
 * LongArray	long[]
 * ShortArray	short[]
 */
fun arrayDemo3() {
    val exampleArray = IntArray(5)
    println(exampleArray.joinToString())
}

fun main() {
//    useDemo()
//    arrayDemo()
    arrayDemo2()
    operatorDemo()
    varargDemo()
    toListDemo()
}